/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.AntecedentePersonalFisica;
import fisica.CapaFisica;
import hibernate.objeto.Antecedente;
import hibernate.objeto.AntecedentePersonal;
import hibernate.objeto.Cie9mc;
import hibernate.objeto.DiagnosticoYTriageInternacion;
import hibernate.objeto.EnfermedadYDiagnosticoAmbulatorio;
import hibernate.objeto.Paciente;
import java.util.Date;
import java.util.Vector;
import presentacion.CapaPresentacion;

/**
 *
 * @author Gonzalo
 */
public class AntecedentePersonalLogica extends CapaLogica {

    /**
     * Crea y persiste los objetos Antecedente Personal.
     *
     * @param datosAntecedentesPersonal Los datos correspondientes al apartado
     * Antecedentes Personal
     * @param antecedente El antecedente al cual se asocia
     * @return true si se agregó correctamente, false en caso contrario
     */
    public static boolean agregarAntecedentePersonal(
            Object[][] datosAntecedentesPersonal, Antecedente antecedente) {
        //Crea el objeto Antecedenete Personal
        AntecedentePersonal antecedentePersonal;

        int cantidadObjetosACrear = datosAntecedentesPersonal.length;
        int objetosCreados = 0;

        for (int i = 0; i < cantidadObjetosACrear; i++) {
            antecedentePersonal = crearObjetoAntecedentePersonal(
                    datosAntecedentesPersonal[i], antecedente);

            if (!CapaFisica.guardarOActualizarObjeto(antecedentePersonal)) {
                return false;
            } else {
                objetosCreados = objetosCreados + 1;
            }
        }

        if (objetosCreados == cantidadObjetosACrear) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea un objeto AntecedenteFamiliar con los datos pasados por parámetro.
     *
     * @param datosAntecedentesPersonal Los datos particulares del objeto
     * @param antecedente El antecedente asociado
     * @return El objeto AntecedentePersonal recien creado
     */
    private static AntecedentePersonal crearObjetoAntecedentePersonal(
            Object[] datosAntecedentesPersonal, Antecedente antecedente){

        AntecedentePersonal antecedentePersonal = new AntecedentePersonal();

        antecedentePersonal.setAntecedente(antecedente);

        antecedentePersonal.setFechaAntecedentePersonal(
                (Date) datosAntecedentesPersonal[
                ANTECEDENTE_ENFERMEDAD_FECHA]);

        antecedentePersonal.setCie9mc(Cie9mcLogica.getCie9mcPorCodigo(
                ((Cie9mc) datosAntecedentesPersonal[
                ANTECEDENTE_ENFERMEDAD_CIE9MC]).getCodigoCie9mc()));

        antecedentePersonal.setInformacionComplementariaAntecedentePersonal(
                datosAntecedentesPersonal[
                ANTECEDENTE_ENFERMEDAD_INFORMACION_COMPLEMENTARIA].toString());

        antecedentePersonal.setOtrosAntecedentesAntecedentePersonal(
                datosAntecedentesPersonal[
                ANTECEDENTE_ENFERMEDAD_OTROS_ANTECEDENTES].toString());

        return antecedentePersonal;
    }

    /**
     * Crea un antecedente para una enfermedad.
     *
     * @param entidad La enfermedad ambulatoria o el diagnóstico de internación
     * a agregar
     * @param paciente El paciente a quien se agrega el antecedente
     * @return true si se agregó correctamente, false en caso contrario
     */
    public static boolean setearEnfermedadComoAntecedente(Paciente paciente,
            Object entidad) {
        Antecedente antecedente = AntecedenteLogica.crearObjetoAntecedente(paciente);

        if (CapaFisica.guardarOActualizarObjeto(antecedente)) {
            AntecedentePersonal antecedentePersonal = new AntecedentePersonal();

            if (entidad instanceof EnfermedadYDiagnosticoAmbulatorio) {
                antecedentePersonal.setCie9mc(
                        ((EnfermedadYDiagnosticoAmbulatorio) entidad).
                        getCie9mc());
            
            } else if (entidad instanceof DiagnosticoYTriageInternacion) {
                antecedentePersonal.setCie9mc(
                        ((DiagnosticoYTriageInternacion) entidad).
                        getEpicrisisInternacion().getCie9mc());
            }

            antecedentePersonal.setAntecedente(antecedente);
            antecedentePersonal.setFechaAntecedentePersonal(new Date());

            if (CapaFisica.guardarOActualizarObjeto(antecedentePersonal)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    
    /**
     * Elimina un antecedente que coincida con la fecha y el cie9mc.
     * 
     * @param fecha La fecha
     * @param cie9mc La enfermedad
     */
    public static void eliminarAntecedentePorCie9mc(Cie9mc cie9mc) {
        AntecedentePersonal antecedentePersonal =
                getAntecedentePersonalPorCie9mc(cie9mc);

        if (antecedentePersonal != null) {
            Antecedente antecedente = antecedentePersonal.getAntecedente();
            CapaFisica.eliminarObjeto(antecedentePersonal);
            CapaFisica.eliminarObjeto(antecedente);
        }
    }

    /**
     * Retorna el objeto AntecedentePersonal según el ID.
     *
     * @param idAntecedentePersonal El id del objeto AntecedentePersonal
     * @return El objeto AntecedentePersonal consultado, null si no existe
     */
    public static AntecedentePersonal getAntecedentePersonalPorId(
            int idAntecedentePersonal) {
        return AntecedentePersonalFisica.getAntecedentePersonalPorId(
                idAntecedentePersonal);
    }

    /**
     * Retorna el vector de objetos AntecedentePersonal según el id del paciente.
     *
     * @param idPaciente El id del paciente consultado
     * @return El vector de objetos AntecedentePersonal consultado, null si no
     * existe
     */
    public static Vector<AntecedentePersonal> getVectorAntecedentePersonalPorIdPaciente(
            int idPaciente) {
        return AntecedentePersonalFisica.getVectorAntecedentePersonalPorIdPaciente(
                idPaciente);
    }

    /**
     * Retorna el último antecedente personal cargado del paciente consultado
     *
     * @param idAntecedente El id del antecedente asociado
     * @return El objeto AntecedentePersonal consultado, null si no existe
     */
    public static AntecedentePersonal getAntecedentePersonalMasRecientePorIdAntecedente(
            int idAntecedente) {
        Vector<AntecedentePersonal> antecedentePersonal = AntecedentePersonalFisica.
                getVectorAntecedentePersonalPorIdAntecedente(idAntecedente);

        if (antecedentePersonal != null) {
            return antecedentePersonal.lastElement();
        } else {
            return null;
        }
    }

    /**
     * Retorna el objeto antecedente por fecha y cie9mc
     *
     * @param fecha La fecha
     * @param cie9mc El cie9mc
     * @return El objeto AntecedentePersonal consultado, null si no existe
     */
    private static AntecedentePersonal getAntecedentePersonalPorCie9mc(
            Cie9mc cie9mc) {
        return AntecedentePersonalFisica.getAntecedentePersonalPorCie9mc(cie9mc);
    }

    /**
     * Retorna el texto HTML correspondiente a la descripcion del antecedente
     * personal del paciente.
     *
     * @param paciente El paciente
     * @return El String que contiene el HTML
     */
    public static String getAntecedentePersonalHTML(Paciente paciente) {
        String antecedentePersonalHTML = "";

        Vector<AntecedentePersonal> vectorAntecedentePersonal =
                getVectorAntecedentePersonalPorIdPaciente(paciente.getIdPaciente());

        if (vectorAntecedentePersonal != null) {
            for (int i = 0; i < vectorAntecedentePersonal.size(); i++) {
                antecedentePersonalHTML +=
                        "<hr /><font size=\"3\" face=\"arial\" color=\"blue\">ANTECEDENTE PERSONAL</font><hr /> " +
                        "<font size=\"3\" face=\"arial\" color=\"black\">Fecha: </font>"
                        + "<font size=\"3\" face=\"arial\">" +
                        CapaPresentacion.imprimirFecha(
                        vectorAntecedentePersonal.get(i).getFechaAntecedentePersonal()) + "</font><br>" +
                        Cie9mcLogica.getCie9mcHTML(vectorAntecedentePersonal.get(i).getCie9mc()) +
                        "<font size=\"3\" face=\"arial\" color=\"black\">Información complementaria: </font><br>"
                        + "<font size=\"3\" face=\"arial\">" +
                        vectorAntecedentePersonal.get(i).getInformacionComplementariaAntecedentePersonal() + "</font><br>" +
                        "<font size=\"3\" face=\"arial\" color=\"black\">Otros antecedentes: </font><br>"
                        + "<font size=\"3\" face=\"arial\">" +
                        vectorAntecedentePersonal.get(i).getInformacionComplementariaAntecedentePersonal() + "</font><br><br>";
            }
        } else {
            antecedentePersonalHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">ANTECEDENTES PERSONALES</font><br> " +
                    "<font size=\"3\" face=\"arial\">No posee</font><br></font>";
        }

        return antecedentePersonalHTML;
    }

}
